package com.itheima.controller;

import com.itheima.pojo.Account;
import com.itheima.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 获取请求参数:
 * 1. "参数名=参数值&参数名=参数值&参数名=参数值"---->参数类型form-data: get请求
 *    "参数名=参数值&参数名=参数值&参数名=参数值"----->x-www-form-urlencoded: 表单post方式提交
 *    1.1 以单个参数接收: 在处理请求的方法中添加参数，保证方法的参数名和请求参数名一致就行
 *        springmvc对一些常用的类型，内置有转换器
 *    1.2 以对象接收
 *        1.2.1 POJO 对象，在处理请求的方法中添加一个POJO类型的参数，保证POJO中的参数名和要接收的参数名对应
 *        1.2.2 Map 对象(map的key就是参数名，map的value就是参数值只能是String类型)
 *              必须在参数前添加上RequestParam注解
 *        1.2.3 接收多个同名的请求参数，直接封装到List中,此时要在List类型的参数前添加RequestParam注解
 * 2. {参数名:参数值,参数名:参数值}----->参数类型json: vue的post请求、postman中设置Content-Type为"application/json"
 *    1. 封装到POJO中:
 *       1.1 POJO 中的属性和请求参数要对应
 *       1.2 必须在方法的POJO类型的参数前添加RequestBody注解
 *       1.3 必须在项目中引入jackson的依赖(不能是fastjson的依赖)
 *           因为spring默认支持的就是jackson，如果你想在你的项目中使用
 *           fastjson那么就得自己配置spring的fastjson的支持
 * 常用注解:
 * 1. RequestParam注解:
 *    1.1 用在获取请求参数，封装到List或者Map的时候一定要加RequestParam注解
 *    1.2 当请求参数名和方法的参数名不一致的时候，可以使用RequestParam注解指定获取具体的哪个请求参数进行赋值
 * 2. RequestBody注解:
 *    2.1 获取请求体信息
 *    2.2 获取json类型的请求参数，封装到POJO中
 * 3. RequestHeader注解:
 *    获取指定请求头的信息
 * 4. SessionAttributes注解:往session中存放数据
 * Controller中的方法的返回值类型:
 * 1. 返回String类型:
 *    1. 如果有视图解析器，就会去执行视图解析器解析视图
 */
@Controller
@RequestMapping("user")
public class UserController {

    /**
     * 获取客户端提交的请求参数username和age的值
     * @return
     */
    @RequestMapping("/getName")
    public String getName(@RequestParam("name")String username,int age){
        System.out.println("获取到的请求参数是:" + username+",年龄是:"+age);
        return "success";
    }

    @PostMapping("/register")
    public String register(User user){
        System.out.println("获取到客户端的注册信息:" + user);
        return "success";
    }

    /**
     * 获取多个id的值
     * @return
     */
    @RequestMapping("/deleteAll")
    public String deleteAll(@RequestParam List<Integer> id){
        System.out.println("获取到的客户端要删除的用户的id为:" + id);
        return "success";
    }

    /**
     * 接收多个请求参数(form-data类型)，封装到map中
     * @return
     */
    @RequestMapping("/paramsToMap")
    public String paramsToMap(@RequestParam Map<String,Object> map){
        System.out.println("获取到的请求参数存放在map:" + map);
        return "success";
    }

    @RequestMapping("/useServletApi")
    public String userServletApi(HttpSession session, HttpServletRequest request){
        String header = request.getHeader("User-Agent");
        System.out.println(header);
        //向使用session对象存值
        session.setAttribute("username","奥巴马");
        return "success";
    }

    /**
     * 获取请求体的信息，并且赋值给body变量
     * 获取请求体的目的:获取请求体中的请求参数
     * @param body
     * @return
     */
    @PostMapping("/getRequestBody")
    public String getRequestBody(@RequestBody String body){
        System.out.println(body);
        return "success";
    }

    /**
     * 获取所有的请求参数，封装到User对象中
     * @return
     */
    @PostMapping("/getUserInfo")
    public String getUserInfo(@RequestBody User user){
        System.out.println("获取的请求参数是:" + user);
        return "success";
    }

    @DeleteMapping("/{userId}/{cardNumber}")
    public String deleteById(@PathVariable("userId") int userId,@PathVariable("cardNumber") String cardNumber){
        System.out.println("要删除的用户的id为:" + userId+",身份证号是:"+cardNumber);
        return "success";
    }

    @GetMapping("/{userId}/{cardNumber}")
    public String findById(@PathVariable("userId") int userId,@PathVariable("cardNumber") String cardNumber){
        System.out.println("要查询的用户的id为:" + userId+",身份证号是:"+cardNumber);
        return "success";
    }

    /**
     * 获取userAgent请求头的信息
     * @return
     */
    @RequestMapping("/getUserAgent")
    public String getUserAgent(@RequestHeader("user-Agent") String userAgent){
        System.out.println("请求头userAgent的信息:" + userAgent);
        return "success";
    }

    /**
     * 获取名字叫做JSESSIONID的cookie的值
     * @param cookieValue
     * @return
     */
    @RequestMapping("/getCookieValue")
    public String getCookieValue(@CookieValue("JSESSIONID") String cookieValue){
        System.out.println("获取的cookie的值为:" + cookieValue);
        return "success";
    }

    /*@ModelAttribute
    public Account getAccountById(int id){
        System.out.println("根据id查询账户信息:" + id);
        Account account = new Account();
        account.setName("张三");
        account.setMoney(1000.0);
        return account;
    }*/

    @RequestMapping("/updateAccount")
    public String updateAccount(Account account){
        System.out.println("要修改的用账户的数据是:" + account);
        return "success";
    }

    /**
     * 调用该方法:往域对象中存放一个msg的值
     * @return
     */
    @RequestMapping("/msg")
    public String msg(Model model){
        //SpringMVC中model表示数据模型,其实也就是往域对象中存放数据
        model.addAttribute("msg","我是域对象中msg信息");
        return "success";
    }

    @RequestMapping("/useModelAndView")
    public ModelAndView useModelAndView(){
        //ModelAndView是什么意思:数据模型和视图，它里边既包含域对象中的数据，又包含视图地址
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("msg","我是ModelAndView中的值");
        modelAndView.setViewName("success");

        return modelAndView;
    }

    /**
     * 测试使用重定向
     * @return
     */
    @RequestMapping("/testRedirect")
    public String testRedirect(){
        return "redirect:http://www.baidu.com";
    }

    @RequestMapping("/responseJson")
    @ResponseBody
    public User responseJson(){
        User user = new User();
        user.setName("张三");
        user.setAddress("深圳");
        user.setBirthday(new Date());
        user.setAge(18);
        //目标: 将user转换成Json字符串，并且输出给浏览器
        return user;
    }
}
